package simpledb.storage;

/**
 * HeapPageId 实现了接口 PageId，表示一个堆文件中某个特定页面的唯一标识
 * 每个页面 ID 都由两部分组成:
 * 1、表 ID（tableId）：标识这个页面属于哪个表
 * 2、页面号（pageNum）：标识在该表中的第几个页面。
 */
public class HeapPageId implements PageId {

    private final int tableId;

    private final int pageNum;

    /**
     * 构造函数。创建一个用于指定表的特定页面的页面ID结构。
     *
     * @param tableId 被引用的表
     * @param pgNo    表中的页面号
     */
    public HeapPageId(int tableId, int pgNo) {
        this.tableId = tableId;
        this.pageNum = pgNo;
    }

    /**
     * 返回与此 PageId 关联的表。
     */
    @Override
    public int getTableId() {
        return this.tableId;
    }

    /**
     * 返回与此 PageId 关联的页面号。
     */
    @Override
    public int getPageNumber() {
        return this.pageNum;
    }

    /**
     * 将此对象序列化为整型数组，用于写入磁盘。
     * 返回数组的大小必须与其中一个构造函数的参数数量相对应。
     */
    @Override
    public int[] serialize() {
        int data[] = new int[2];

        data[0] = getTableId();
        data[1] = getPageNumber();

        return data;
    }

    @Override
    public int hashCode() {
        int result = 31 * tableId + pageNum;
        return result;
    }

    /**
     * 比较两个 PageId 是否相等。
     *
     * @param o 要比较的对象（必须是 PageId）
     * @return 如果两个对象相等（即 page number 和 table id 相同），返回 true
     */
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (o instanceof PageId) {
            PageId another = (PageId) o;
            return this.pageNum == another.getPageNumber() && this.tableId == another.getTableId();
        } else {
            return false;
        }
    }
}
